package com.fi.recogn.dto.table;

import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Builder;
import lombok.Data;
import lombok.experimental.Accessors;

import java.io.Serializable;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Set;

/**
 * @author songqiang
 * @desc
 * @created on 2023 年 11 月 11
 * @Date 10:20
 * @since 1.0
 */
@Data
@Builder
@ApiModel
@Accessors(chain = true)
public class Cell implements Serializable {

    /**
     * 单元格id
     */
    @JsonSerialize(using = ToStringSerializer.class)
    @ApiModelProperty("单元格id")
    private Long cellId;

    /**
     * 单元格的位置信息， 以长度为8的整形数组表示四边形， 语义左上角为起始点顺时针构成闭合区域
     */
    @JsonIgnore
    private List<Long> position;

    @ApiModelProperty("是否是表头，0：不是，1：是")
    private Integer isHeader = 0;
    /**
     * 单元格的起始行
     */
    @ApiModelProperty("单元格的起始行")
    private Integer startRow;

    /**
     * 单元格的结束行
     */
    @ApiModelProperty("单元格的结束行")
    private Integer endRow;

    /**
     * 单元格的起始列
     */
    @ApiModelProperty("单元格的起始列")
    private Integer startCol;

    /**
     * 单元格的结束列
     */
    @ApiModelProperty("单元格的结束列")
    private Integer endCol;

    /**
     * 单元格内所有识别结果的合并字符串
     */
    @ApiModelProperty("单元格内所有识别结果的合并字符串")
    private String text;

    /**
     * 以文本行为单位的识别结果
     */
    @JsonIgnore
    private List<Line> lines;

    /**
     * 当前字段命中后台表情况（记录命中过程），map结构说明： k->后台表单id,v->表单定义字段
     */
    @JsonIgnore
    private Map<Long, List<Long>> hitWordMap;

    /**
     * 记录定义字段和关键字id关系 k->后台表定义字段id ，v-> 定义字段的关键字id
     */
    private Map<Long, Integer> hitWordConditionMap;

    /**
     * 记录命中模糊数量
     */
    @JsonIgnore
    private Map<Long, List<Long>> hitWordFuzzyMap;

    /**
     * 正式关联，由于人工操作后存在多对多的强关联，所以这里用集合存放，Map：k-> 后台表id v-> 表字段定义id
     */
    @ApiModelProperty("关联字段")
    private List<HitWord> hitRelation = new LinkedList<>();

    /**
     * 命中排除关键词情况，排除关键字id
     */
    @JsonIgnore
    private Set<Integer> hitExcludeWord;

    /**
     * 临时存放被移除的关联关系
     */
    @JsonIgnore
    private List<Long> removeRelation;

    /**
     * 提取类型，1：运作公告
     *
     * @see com.fi.common.enums.ExcelFetchTypeEnum
     */
    @JsonIgnore
    private Integer fetchType;

    @ApiModelProperty("子表头值")
    private String subHeaderMd5;

    @ApiModelProperty("分组排序")
    private Integer groupSorted;

}
